<?php
/*
 * 최초작성일 	: 2008. 08. 11
 * 작성자 	: 조성훈 (akdddnet@gmail.com)
 *
 * 수정내역	
 * 		1. 2010. 12. 30
 * 			- IMessenger 사용안함. 
 */

 	require_once __DIR__."/../utility/Common.php";
 	
 	/**
 	 * Diretory class
 	 */
	class Directorys extends Exception
	{
		private $dirName;				// 디렉토리명
		private $permission;			// 퍼미션
		
		
		/**
		 * 생성자
		 */
		public function __construct($path=null, $permission=707)
		{
			// path값이 빈값이면 기본 document_root path으로 설정
			if(Common::isNullOrEmpty($path)) 
				$this->dirName = $_SERVER['DOCUMENT_ROOT'].'/';
			
			// 기본 퍼미션값 설정			
			$this->permission = $permission;
		}
		
		
		public function getDirName()
		{
			return $this->dirName;	
		}
		
		public function setDirName($dirName)
		{
			$this->dirName = $dirName;
		}
		
		
		public function getPermission()
		{
			return $this->permission;	
		}
		
		public function setPermission($permission)
		{
			$this->permission = $permission;	
		}
		
		
		/**
		 * dirName 을 기준으로 하위 폴더명을 리턴합니다.
		 * 
		 * @param string $dirName : 디렉토리명
		 * @return Messenger $mesg : Messenger Object
		 */
		public function getDirList($dirName = null, $directoryOnly=true)
		{	
			try
			{
				if($dirName == NULL || Common::isNullOrEmpty($dirName)) 
					$dirName = $this->getDirName();
					
				if(!$this->isDirectory($dirName))
				{
					throw new Exception('디렉토리가 존재하지 않습니다.');
				}
				else 
				{
					$dirList = opendir($dirName);
					$dirAList=array();
					while($entry=readdir($dirList))
					{
						if($directoryOnly)
						{
							if(!eregi('\.',$entry))
							{
								$dirAList[]=$entry;
							}
						}
						else 
						{
							// ., ..은 제외함.
							if(!strcmp($entry, '.') || !strcmp($entry, '..'))
							{
								continue;
							}
							else 
							{
								$dirAList[]=$entry;
							}
						}
					}
					closedir($dirList);
					
					return $dirAList;
				}
			}
			catch(Exception $e)
			{
				throw new Exception($e);
			}	
			
			return false;
		}
		
		
		/**
		 * 해당 디렉토리 안의 파일들을 모두 리턴합니다.
		 * @param string $dirName : 디렉토리명
		 * @return Messenger $mesg : Messein
		 */
		public function getDirFileList($dirName = null)
		{
			
		}
		
		/**
		 * 디렉토리가 존재하는지 확인합니다.
		 * 
		 * @param string $dirName : 디렉토리명
		 * @return boolen (존재 : true, 존재X : false)
		 */
		public function isDirectory($dirName = null)
		{
			if(Common::isNullOrEmpty($dirName)) 
				return is_dir($this->dirName);
			else 
				return is_dir($dirName);
		}
		
		/**
		 * 디렉토리를 생성합니다.
		 * @param string $dirName : 디렉토리명(필수)
		 * @param int $permission : 퍼미션
		 * @return Messenger $mesg : Messenger Object
		 */
		public function makeDir($dirName, $permission=null)
		{
			try
			{
				// 디렉토리명을 입력하지 않았을 경우.
				if(Common::isNullOrEmpty($dirName)) 
				{
					throw new Exception('디렉토리명을 입력하지 않았습니다.');
				}
				else 
				{
					// 퍼미션값이 입력되지 않았으면 기본값으로 셋팅
					if(Common::isNullOrEmpty($permission)) 
						$permission = $this->permission;
					else 
						$this->permission = $permission;
					 
					 
					if(!$this->isDirectory($dirName))
					{
						mkdir($dirName, $this->permission);
					}
				}
			}
			catch(Exception $e)
			{
				throw new Exception($e);	
			}
		}
		
		
		/**
		 * 폴더를 삭제합니다. (테스트 안해봄)
		 * @param string $dirName : 폴더명
		 * @param boolen $preserve : 폴더 보존 여부(true면 폴더까지 삭제, false면 폴더안의 파일만 삭제됨)
		 * @return Messenger $mesg : Messenger Object
		 */
		public function removeDirectory($dirName, $preserve=true)
		{
			try
			{
				if(Common::isNullOrEmpty($dirName)) 
				{
					throw new Exception('삭제할 폴더명을 입력해주세요.');
				}
				else 
				{
					if($this->isDirectory($dirName))
					{
						$dirList = opendir($dirName);
						while($entry = readdir($dirList))
						{
							// ., .. 폴더는 건너뛰고
							if(!strcmp($entry, '.') || !strcmp($entry, '..'))
							{
								continue;
							}	
							else 
							{
								$delFile = $dirName.rtrim($entry);

								// 삭제하려는 디렉토리에 파일이 존재하면 파일먼저 삭제 
								if(!is_file($delFile))
									$this->removeDirectory($delFile.'/');
								else 
								{
									if(!@unlink($delFile))
									{
										throw new Exception('파일 삭제에 실패했습니다.');	
									}	
								}
							}
						}
						closedir($dirList);
						
						// 폴더삭제 해야되는 경우
						if($preserve)
						{
							// 폴더 삭제에 실패했을 경우.
							if(!rmdir($dirName))
							{
								throw new Exception('폴더 삭제에 실패했습니다.');
							}	
							else 
							{
								throw new Exception('성공적으로 삭제되었습니다.');	
							}
						}
					}
				}
				
										
			}
			catch(Exception $e)
			{
				throw new Exception ($e);
			}
		}
	}
?>
